1. Introduction

In 2021, the Charlotte Area Transit System (CATS) embarked on ‘The Bus Priority Study’ as part of the city’s larger Strategic Mobility Plan, aiming to enhance bus trips’ speed, reliability, and convenience for riders. To achieve this, CATS set out to understand recent dynamics, explore accessibility, and examine network efficiencies.

1.1 CATS identified three primary objectives:

  1. Understanding recent bus ridership dynamics involved
  2. Exploring thepresent reality of bus accessibility, considering ridership trends and demographic distributions.
  3. Examining network efficiencies and possibilities

2. Use case

Our team will support CATS transportation planners in improving bus line efficiency by analyzing historical ridership trends per bus stop to identify and predict underperforming stops and routes.

With this, we will propose alternate network options through a web-based dashboard that presents predictions with the context of demographic, spatial, financial factors of influence.

3. Data

3.1 Datasets considered

To analyze and forecast performance trends, we have used ridership data from CATS for the years between 2017 and 2023. Additionally we have identified potential demographic, spatial, and economic parameters that may influence our predictor variable that is ridership.

3.2 Limitations of dataset

On initial review, certain limitations of the data present themselves. These include: 1. No hourly ridership data is available precluding us from analyzing peak hour trends 2. Weekend vs weekday ridership is not available which leads to the assumption of similar usage patterns of weekends, weekdays, and holidays 3. Data on stops added or removed in these years of study is not explicit 4. Only stop locations are made available which means route locations will have to be sourced and spatially joined. This allows us to join only the most recent route data for these stops. 5. The dataset for 2023 is incomplete and only includes data for months January to November.

3.3 Data Wrangling

3.4 APC data

ggplot(busstop_sf) +
  geom_sf(data = allTracts_sf, fill = "grey90", alpha = 0.8 , color = NA)+
  geom_sf(aes(color = Board), size = .5) +
  scale_color_gradient(low = "blue", high = "red") +
  theme_minimal() +
  labs(title = "Bus Stops", color = "Board Value")

ggplot(busstop_sf) +
  geom_sf(data = allTracts_sf, fill = "grey90", alpha = 0.8 , color = NA)+
  geom_sf(aes(color = Alight), size = .5) +
  scale_color_gradient(low = "blue", high = "red") +
  theme_minimal() +
  labs(title = "Bus Stops", color = "Alight Value")

5. Spatial factors:

5.1 Existing and proposed transit lines and stations

Other existing and proposed transit stops and routes are considered to study the relationship between infrastructure and underperforming stops, if any. If significant, the distance of bus stops to other transit stops would also serve as variables in the model.

transit <- ggplot() +
  geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, aes(color = "Bus Route"), size = 5, alpha = 0.5) +
  geom_sf(data = blue_routes, aes(color = "Blue Line"), size = 8) +
  geom_sf(data = blue_stops, aes(color = "Blue Line"), size = 2) +
  geom_sf(data = gold_routes, aes(color = "Gold Line"), size = 8) +
  geom_sf(data = gold_stops, aes(color = "Gold Line"), size = 2) +
  geom_sf(data = silver_routes, aes(color = "Silver Line"), size = 8, linetype = "dashed") +
  geom_sf(data = silver_stops, aes(color = "Silver Line"), size = 2, shape = 21) +
  geom_sf(data = red_routes, aes(color = "Red Line"), size = 8, linetype = "dashed") +
  geom_sf(data = red_stops, aes(color = "Red Line"), size = 2, shape = 21) +
  
  labs(title = "Existing and Proposed Transit Lines and Stops") +
    scale_color_manual(name = "Lines",
                     values = c("Bus Route" = "darkgrey",
                                "Blue Line" = "#4682B4", 
                                "Gold Line" = "#FFD700", 
                                "Silver Line" = "purple", 
                                "Red Line" = "#FF6347"),
                     labels = c("Blue Line","Bus Routes", "Gold Line", "Proposed Red Line", "Proposed Silver Line")) +

  mapTheme()

print(transit)

5.2 Density of Amenities

Most amenities are clustered within the city center and expanded to the south, presenting an inequitable distribution. For model input, the distance to the amenities would serve as variables as well

A <- ggplot() + geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, color = "darkgrey", size = 5, alpha = 0.5) +
  geom_sf(data = school, color = "darkgrey", size = .5, alpha = 0.3) +
  stat_density2d(data = data.frame(st_coordinates(school.sf)), 
                 aes(X, Y, fill = ..level.., alpha = ..level..),
                 size = 0.01, bins = 40, geom = 'polygon') +
  scale_fill_gradient(low = "grey", high = "#FFE6A7", name = "Density") +
  scale_alpha(range = c(0.00, 0.1), guide = "none") +
  labs(title = "Density of Schools") +
  mapTheme()

B <- ggplot() + geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, color = "darkgrey", size = 5, alpha = 0.5) +
  geom_sf(data = parks, color = "darkgrey", size = .5, alpha = 0.5) +
  stat_density2d(data = data.frame(st_coordinates(parks.sf)), 
                 aes(X, Y, fill = ..level.., alpha = ..level..),
                 size = 0.01, bins = 40, geom = 'polygon') +
  scale_fill_gradient(low = "grey", high = "#7ACFD3", name = "Density") +
  scale_alpha(range = c(0.00, 0.1), guide = "none") +
  labs(title = "Density of Parks") +
  mapTheme()

C <- ggplot() + geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, color = "darkgrey", size = 5, alpha = 0.5) +
  geom_sf(data = groceries, color = "darkgrey", size = .5, alpha = 0.5) +
  stat_density2d(data = data.frame(st_coordinates(groceries.sf)), 
                 aes(X, Y, fill = ..level.., alpha = ..level..),
                 size = 0.01, bins = 40, geom = 'polygon') +
  scale_fill_gradient(low = "grey", high = "#FFAB00", name = "Density") +
  scale_alpha(range = c(0.00, 0.1), guide = "none") +
  labs(title = "Density of Grocery Stores") +
  mapTheme()

D <- ggplot() + geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, color = "darkgrey", size = 5, alpha = 0.5) +
  geom_sf(data = policeoffice, color = "darkgrey", size = .5, alpha = 0.5) +
  stat_density2d(data = data.frame(st_coordinates(policeoffice.sf)), 
                 aes(X, Y, fill = ..level.., alpha = ..level..),
                 size = 0.01, bins = 40, geom = 'polygon') +
  scale_fill_gradient(low = "grey", high = "#0077B6", name = "Density") +
  scale_alpha(range = c(0.00, 0.1), guide = "none") +
  labs(title = "Density of Police Offices") +
  mapTheme()

E <- ggplot() + geom_sf(data = dat2020, fill = "grey90", alpha = 0.5, color = NA) +
  geom_sf(data = bus_routes, color = "darkgrey", size = 5, alpha = 0.5) +
  geom_sf(data = shoppingcen, color = "darkgrey", size = .5, alpha = 0.5) +
  stat_density2d(data = data.frame(st_coordinates(shoppingcen.sf)), 
                 aes(X, Y, fill = ..level.., alpha = ..level..),
                 size = 0.01, bins = 40, geom = 'polygon') +
  scale_fill_gradient(low = "grey", high = "#FF6662", name = "Density") +
  scale_alpha(range = c(0.00, 0.1), guide = "none") +
  labs(title = "Density of Shopping Centers") +
  mapTheme()


combined_maps <- A + B + C + D + E
#combined_maps <- combined_maps / plot_layout(nrow = 2, ncol = 3)
print(combined_maps)

6. Demographic Factors

7. Next Steps

1.To identify most significant demographic and spatial variables for predicting underperformance 2. To present findings to clients and solicit feedback 3. To arrive at best modeling process to predict stops that are likely to underperform 4. To propose removal of and addition of stops to certain routes and examine their equity and financial impact 5. To create a web-based dashboard that allows CATS transportation planners to overlay socioeconomic, equity, and financial factors with underperformance to be able to allocate resources to stops effectively

In doing so, our aim is to build a comprehensive and robust model to optimize bus line efficiency, aligning with CATS’ goal of providing faster, more reliable, and convenient transit options for Charlotte residents.